昨天我們建立好了 Pipeline,並且以手動的方式觸發構建,讓 Jenkins 可以拉取程式碼,並打包為 Image 傳送到 Harbor 內部,完成了 Integration & Delivery;今天,讓我們完成最後的部署,以及設定 Webhook,讓 Gitlab Repository 更新時自動通知 Jenkins 來執行 Pipeline 吧!
在 Day19 的時候,我們完成了 Image 推送到 Harbor,並且以 Putty 遠端連線到 192.168.1.188
的 SIT 機器,手動拉取 Image 並啟動 Container;而現在我們要交由 Jenkins 為我們完成這些步驟。
首先,我們要到 管理 Jenkins
的 Plugin Manager 搜尋並安裝 Publish Over SSH
這個 Plugin。
使用 Publish Over SSH 能夠用兩種方法,第一種是創建與配置公鑰與私鑰,第二種則是將 SIT 機器的 User 帳號密碼存在 Jenkins 內在要遠端登入時使用。本次將會以第二種方法展示,若有網域與憑證的話也能夠使用第一種方式。
我們到 管理 Jenkins
的 System Configuration
中,在最下方的設置可以看到 Publish over SSH
,點選新增後,我們來逐一填上需要的配置:
SIT188
192.168.1.188
配置好後,可以點選 Test Configuration 來連線測試,記得 192.168.1.188
那台要先開機...不然就會和我一樣尷尬了 10 幾分鐘。
再來,我們就可以遠端連線過去執行指令了,然而指令我們其實會先寫好,並放置在 SIT188
機器內,在執行 Pipeline 時僅遠端過去執行腳本,這裡我們為 cct-java 的 Jenkinsfile 多增加一個 Stage:
stage('遠端連線與部署') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'SIT188',
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: '/opt/jenkins_shell/deploy_cct_java.sh',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/opt/jenkins_shell',
remoteDirectorySDF: false, removePrefix: '',
sourceFiles: 'deploy_cct_java.sh'
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false, verbose: true
)
]
)
}
}
上面指定了 SIT188
機器,並且在 execCommand
內說明要到 /opt/jenkins_shell
內執行 deploy_cct_java.sh
腳本。
而腳本概念上要完成幾個內容:
而 Shell 腳本內部由於會寫入 Harbor 的帳號密碼,因此我們在寫完後會將它加密。
#!/bin/sh
#關閉部署中的 container 並刪除 conatiner 與 Image
containerId=`sudo docker ps -a | grep -w 192.168.1.120:9001/cct-java/cct-back:0.0.2 | awk '{print$1}'`
echo '$containerId'
if [ "$containerId" != "" ] ; then
sudo docker stop $containerId
sudo docker rm $containerId
fi
imageId=`sudo docker images | grep -w 192.168.1.120:9001/cct-java/cct-back | awk '{print $3}'`
echo '$imageId'
if [ "$imageId" != "" ] ; then
sudo docker rmi $imageId
fi
#登入並下載新的 Image 與 部署 Container
sudo docker login -u user -p password http://192.168.1.120:9001
sudo docker pull 192.168.1.120:9001/cct-java/cct-back:0.0.2
sudo docker run -p 8081:8081 -d 192.168.1.120:9001/cct-java/cct-back:0.0.2
下一步,我們利用 shc 加密 shell 腳本,在 Ubuntu 上需要先安裝:
sudo add-apt-repository ppa:neurobin/ppa
sudo apt-get update
sudo apt-get install shc
sudo apt-get install gcc
將 deploy_cct_java.sh
加密
sudo mv deploy_cct_java.sh temp.sh
sudo shc -f temp.sh -o deploy_cct_java.sh
完成後,可以將有明文的 temp.sh
刪除,而 deploy_cct_java.sh
則是加密的檔案,可輸入 ./deploy_cct_java.sh
測試是否執行。
接著,我們再到 Jenkins 內手動觸發建置,即可看到被遠端觸發了。
今天,我們完成了遠端的部署,也將開發用的電腦、DevOps 機與 SIT 機串聯再一起了,明天,我們就來建置 Webhook,讓推送原始碼時自動觸發,並且也將前端做完相同的配置,最後為 CI/CD 的建構下一個總結。